package com.gzxt.agricultural.exception;


import com.gzxt.agricultural.vo.Result;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

//代表是一个全局异常注解:这个项目所有报错都会来到这个类里面执行方法
//空指针异常 sql错误 参数异常
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler{

    /**
     * @return EduResult页面的统一返回结果集
     * 捕获所有的异常 也就是说 只要在这个项目里面
     * 任何位置报错了 都会最终来到这里面执行代码
     * 可以吧对象变成json输出到页面去
     * 日志框架
     *  1.导入jar包
     *  2.编写配置文件
     *  3.创建日志对象
     *  4.调用日志方法
     *  他可以把报错的日志 自动保存到电脑硬盘上面
     */
    @ExceptionHandler(value = Exception.class)
    public Result defaultErrorHandler(Exception ex, HttpServletResponse response) {
        //他就会打印报错日志 在控制台上面
        ex.printStackTrace();
        response.setStatus(500);//返回是真的异常信息 会走到catch((error)
        //从jsr303异常里面获取message 然后吧message传到页面去就行了
        if (ex instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException bindException = (MethodArgumentNotValidException) ex;
            BindingResult bindingResult = bindException.getBindingResult();
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            ObjectError objectError = allErrors.get(0);
            String defaultMessage = objectError.getDefaultMessage();
            return Result.error(500,defaultMessage);
        }

        if(ex instanceof AgriculturalException){
            AgriculturalException agriculturalException = (AgriculturalException)ex;
            String message = agriculturalException.getMessage();
            return Result.error(500,message);
        }

        return Result.error(500,"系统出错请联系管理员");
    }
}
